package main

import (
	"fmt"
)

func main() {
	arr := [10]int{1, 2, 2, 3, 4, 2, 2, 2, 3, 4}
	fmt.Println("==============通过数组创建切片==============")
	s1 := arr[0:5]
	s2 := arr[3:8]
	s3 := arr[5:10]
	s4 := arr[:]
	s5 := arr[:8]
	fmt.Println(s1)
	fmt.Println(s2)
	fmt.Println(s3)
	fmt.Println(s4)

	fmt.Printf("%p\n", s1)
	fmt.Printf("%p\n", &arr)

	//切片数组的长度是元素的个数，容量是第几个元素开始到数组末尾的大小
	fmt.Printf("长度：%d 容量 ：%d\n", len(s1), cap(s1)) //长度：5 容量 ：10
	fmt.Printf("长度：%d 容量 ：%d\n", len(s2), cap(s2)) //长度：5 容量 ：7
	fmt.Printf("长度：%d 容量 ：%d\n", len(s3), cap(s3))
	fmt.Printf("长度：%d 容量 ：%d\n", len(s4), cap(s4))
	fmt.Printf("长度：%d 容量 ：%d\n", len(s5), cap(s5))

	//切片和数组指向的地址是同一个  无论哪一个的值改变另一个对应位置的值也会改变
	arr[0] = 100
	fmt.Println(arr)
	fmt.Println(s1)
	s1[1] = 200
	fmt.Println(arr)
	fmt.Println(s1)

	//当一个切片追加元素且超过之前所规定的容量时，他的地址就会改变  所以此时改变s1里面的值  arr里面的值不会发生变化
	s1 = append(s1, 3, 2, 2, 2, 2, 2, 22, 2, 2, 2, 2)
	fmt.Println(s1)
	fmt.Println(arr)
	s1[3] = 400
	fmt.Println(s1)  //[100 200 2 400 4 3 2 2 2 2 2 22 2 2 2 2]
	fmt.Println(arr) //[100 200 2 3 4 2 2 2 3 4]
}
